package com.skilltrack.enrol.api;


import com.skilltrack.enrol.model.dto.AddCourseDto;
import com.skilltrack.enrol.model.dto.CourseBaseInfoDto;
import com.skilltrack.enrol.model.dto.EditCourseDto;
import com.skilltrack.enrol.model.dto.QueryCourseParamsDto;
import com.skilltrack.enrol.model.po.CourseBase;
import com.skilltrack.enrol.service.CourseBaseInfoService;
import com.skilltrackedu.exception.ValidationGroup;
import com.skilltrackedu.model.PageParams;
import com.skilltrackedu.model.PageResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;


/**
 * @author Mr.M
 * @version 1.0
 * @description 课程信息编辑接口
 * @date 2022/9/6 11:29
 */
@Api(value = "课程信息编辑接口", tags = "课程信息编辑接口")
@RestController
public class CourseBaseInfoController {

    @Autowired
    private CourseBaseInfoService courseBaseInfoService;

    /**
     * 课程查询接口
     * 该接口用于分页查询课程信息
     *
     * @param pageParams        分页查询参数 包含页码和每页大小
     * @param queryCourseParams 分页查询条件 包含课程查询的具体条件 可能为空
     * @return PageResult<CourseBase> 返回分页结果对象 包含课程基础信息列表和分页信息
     */
    @ApiOperation("课程查询接口")
    @PostMapping("/course/list")
    public PageResult<CourseBase> list(@ApiParam("分页查询参数") PageParams pageParams, @ApiParam("分页查询条件") @RequestBody(required = false) QueryCourseParamsDto queryCourseParams) {
        // 手动设置默认值
        // 如果页码未指定，则默认为第1页
        if (pageParams.getPageNo() == null) {
            pageParams.setPageNo(1L);
        }
        // 如果每页大小未指定，则默认每页10条记录
        if (pageParams.getPageSize() == null) {
            pageParams.setPageSize(10L);
        }
        // 调用服务层方法执行课程列表查询
        return courseBaseInfoService.queryCourseBaseList(pageParams, queryCourseParams);

    }


    /**
     * 新增课程信息
     * 此方法通过API操作，将用户提交的课程信息添加到系统中
     * 主要功能包括：获取用户所属机构的ID，并将新增课程信息传递给服务层进行处理
     *
     * @param addCourseDto 包含新增课程信息的数据传输对象
     * @return 返回新增课程的基础信息DTO
     * @Valod 开启JSR 303校验
     * @Validated: 启用JSR 303校验,可传入分组信息,实现分组校验,我这里传入的是Insert分组,那么只有Insert分组的校验规则生效
     */
    @ApiOperation("新增课程信息")
    @PostMapping("/course")
    public CourseBaseInfoDto createCourseBase(@ApiParam("新增课程信息") @RequestBody @Validated(ValidationGroup.Insert.class) AddCourseDto addCourseDto) {
        //获取到用户所属机构的id
        Long companyId = 1232141425L;
        //调用服务层方法，创建课程基础信息并返回
        return courseBaseInfoService.createCourseBase(companyId, addCourseDto);
    }

    /**
     * 根据课程ID查询课程信息
     * <p>
     * 此方法通过课程ID获取课程的基本信息，以便用户可以查看课程的详细情况
     * 使用GET请求，因为查询操作不会对服务器数据产生更改
     *
     * @param courseId 课程ID，唯一标识一个课程
     * @return 返回课程的基本信息，包括课程名称、描述等
     */
    @ApiOperation("根据课程id查询课程信息")
    @GetMapping("/course/{courseId}")
    public CourseBaseInfoDto getCourseBaseById( @PathVariable Long courseId) {
        // 获取到用户所属机构的id
        return courseBaseInfoService.getCourseBaseById(courseId);
    }


    /**
     * 修改课程信息的接口方法
     * 使用PUT请求映射来更新课程基础信息
     *
     * @param editCourseDto 包含更新课程信息的请求体，通过JSON格式传入，使用ValidationGroup.Update分组进行参数校验
     * @return 返回更新后的课程基础信息DTO
     */
    @ApiOperation("修改课程信息")
    @PutMapping("/course")
    public CourseBaseInfoDto modifyCourseBase(@RequestBody @Validated(ValidationGroup.Update.class) EditCourseDto editCourseDto){
        //获取到用户所属机构的id
        Long companyId = 1232141425L;
        //调用服务层方法，更新课程基础信息并返回
        return courseBaseInfoService.updateCourseBase(companyId, editCourseDto);
    }



}

